package com.zengqingfa.designpattern.behavior.template.hook;

/**
 *
 * @fileName: AbstractTemplate
 * @author: zengqf3
 * @date: 2021-4-9 15:10
 * @description:
 */
public abstract class AbstractTemplate {

    /**
     * 模板方法:final修饰，防止重写
     */
    public final void templateMethod() {
        //调用子类的方法
        abstractMethod();
        if (hook()) {
            doHookMethod();
        }
        //父类实现的方法
        commonMethod();
    }

    /**
     * 抽象方法：由子类去实现
     */
    protected abstract void abstractMethod();

    /**
     * 基本方法(抽象类已经实现，子类拥有的共同代码)
     */
    private final void commonMethod() {
        //业务相关的代码
        System.out.println("模板类中的方法：AbstractTemplate#commonMethod");
    }

    /**
     * 钩子方法(空方法)：子类根据实际情况是否重写,
     * 默认钩子方法
     *一个钩子方法常常由抽象类给出一个空实现作为此方法的默认实现。这种空的钩子方法叫做“Do Nothing Hook”。
     *显然，这种默认钩子方法在缺省适配模式里面已经见过了，一个缺省适配模式讲的是一个类为一个接口提供一个默认的空实现，
     *从而使得缺省适配类的子类不必像实现接口那样必须给出所有方法的实现，因为通常一个具体类并不需要所有的方法。
     * 　　
     *  命名规则
     * 钩子方法的名字应当以do开始，这是熟悉设计模式的Java开发人员的标准做法。在上面的例子中，
     * 钩子方法hookMethod()应当以do开头；在HttpServlet类中，也遵从这一命名规则，如doGet()、doPost()等方法。
     */
    protected void doHookMethod() {

    }

    /**
     * 默认返回true
     * @return
     */
    protected boolean hook() {
        return false;
    }
}
